package com.snoob.bffApi.wConfig.redis;

import com.snoob.bffApi.wConfig.properties.RedisProperties;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.StringCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.MessageFormat;

/**
 * @描述: TODO 官方推荐的Java版的Redis客户端，对原生redis操作进行了封装
 *
 * 中文文档：https://www.bookstack.cn/read/redisson-wiki-zh/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D.md
 *
 * Redisson是一个在Redis的基础上实现的Java驻内存数据网格（In-Memory Data Grid）。它不仅提供了一系列的分布式的Java常用对象，还提供了许多分布式服务
 * BitSet,
 * Set, SortedSet,
 * Map, Multimap,
 * List, Queue, BlockingQueue, Deque, BlockingDeque,  队列
 * Lock,                                              锁
 * Publish / Subscribe,                               订阅分发
 * Bloom filter,                                      布隆过滤器
 * Spring cache,                                      本地缓存
 * Executor service,                                  分布式执行服务
 * Live Object service,                               分布式实时对象
 * Scheduler service                                  分布式调度任务服务
 * Remote service,                                    分布式远程服务
 *
 * @作者: lixing
 * @日期 2021/7/2 15:11
 */
@Configuration
@Component
public class RedissonConfig {
    @Resource
    private RedisProperties redisProperties;

    /**
     * @描述 基于单节点的redis客户端
     * @作者 lixing
     * @日期 2021/7/4 13:49
     * @Param [] 
     * @return org.redisson.api.RedissonClient
     */
    @Bean(value = "redissonSingleClient")
    @Scope("singleton")
    public RedissonClient redissonSingleClient() {
        Config config = new Config();
        // 纯字符串编码（无转换）
        config.setCodec(StringCodec.INSTANCE);
        // Redis单节点模式
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setPassword(redisProperties.getPassword());
        singleServerConfig.setAddress(MessageFormat.format("redis://{0}:{1}",redisProperties.getHost(), redisProperties.getPort()));
        singleServerConfig.setDatabase(redisProperties.getDatabase());
        // 客户端实例
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
        //        if (!redissonClient.isShutdown()) {
        //            redissonClient.shutdown();
        //        }
    }
}
